import type { AxiosRequestConfig, AxiosRequestHeaders } from 'axios'
const { VITE_BASE_API_PATH, VITE_PROXY_API_PATH } = import.meta.env
export const setting: {
  base_url: string
  request_timeout: number
  default_headers: AxiosHeaders
  result_code_key: string
  result_success_code: number | string | boolean
  result_auth_code: number | string | boolean
  result_permit_code: number | string | boolean
  result_msg_key: string
  is_refresh_token_enable: boolean
  is_request_disabled_repeat_enable: boolean
  request_repeat_in_type: string
  ignore_msg: string[]
  whiteList: string[]
} = {
  /**
   * api请求基础路径
   */
  base_url: VITE_PROXY_API_PATH && VITE_PROXY_API_PATH !== '' ? VITE_PROXY_API_PATH : VITE_BASE_API_PATH,
  /**
   * 接口请求超时时间
   */
  request_timeout: 30000,

  /**
   * 默认接口请求类型
   * 可选值：application/x-www-form-urlencoded multipart/form-data
   */
  default_headers: 'application/json',
  /**
   * 接口返回状态码的key值，一般为code，个别程序员可能会是其它key，如status
   */
  result_code_key: 'code',
  /**
   * 接口成功返回状态码，个别程序员可能会返回true|false
   */
  result_success_code: 200,
  /**
   * 接口返回未认证状态码，需要重新登录（认证过期，即登录超时）
   */
  result_auth_code: 401,
  /**
   * 接口返回无权限状态码
   */
  result_permit_code: 403,
  /**
   * 接口返回信息字段key值，一般为msg|message|info等
   */
  result_msg_key: 'msg',
  /**
   * 刷新token是否启用，如果程序端未实现该功能，可关闭前端该功能
   */
  is_refresh_token_enable: false,
  /**
   * 是否全局启用请求禁止重复功能，
   */
  is_request_disabled_repeat_enable: true,
  /**
   * 请求禁止重复开启时，全局默认保留的请求是哪一个，可选择最初的请求，或最近的一次请求，即first|last
   */
  request_repeat_in_type: 'last',
  // 需要忽略的提示，忽略后，自动Promise.reject(error)
  ignore_msg: [
    '无效的刷新令牌', // 刷新令牌被删除时，不用提示
    '刷新令牌已过期' // 使用刷新令牌，刷新获取新的访问令牌时，结果因为过期失败，此时需要忽略。否则，会导致继续 401，无法跳转到登出界面
  ],
  // 不用token接口的请求白名单
  whiteList: ['/login', '/refresh-token']
}

export const axiosVariable: {
  requestList: any[]
  isRefreshToken: boolean
  isReSignIn: boolean
  pendingList: any[]
  pendingMap: Map<string, any>
  loadingRequestCount: number
  loadingInstance: any
} = {
  // 请求队列，无感刷新token时，需要将正在请求的接口缓存，在获取到新的token后，重新进行请求
  requestList: [],
  // 是否正在刷新token
  isRefreshToken: false,
  // 是否显示重新登录提示，多个接口请求在登录超时时，会走多个超时逻辑，这里是为了让超时只显示通知信息一次，不必每个超时接口都显示通知信息
  isReSignIn: false,
  // 禁止重复请求启用后，需要将正在pending状态的请求缓存，用于去判断是否短时间内进行了重复请求
  pendingList: [],
  // pendingList存储请求信息，pendingMap存储请求本身
  pendingMap: new Map(),
  loadingRequestCount: 0,
  loadingInstance: null
}

export interface CustomAxiosRequestConfig<D = any> extends AxiosRequestConfig<D> {
  // 当前请求是否禁止重复
  is_request_disabled_repeat_enable?: boolean
  // 请求重复保留逻辑，重复的请求保留类型可选值：first|last
  request_repeat_in_type?: 'first' | 'last'
  // 当前请求是否启用loading，默认值undefined，表示启用loading，只有在设置值为false时，才表示该请求不启用loading
  is_loading?: boolean | undefined
  // 当前请求是否启用mock
  is_mock?: boolean
  // 当前请求是否需要自定义错误处理，true时，请求会将错误信息返回，在请求的地方自行进行错误提示，否则将由封装的请求自行处理
  is_custom_error?: boolean
}

export interface CustomInternalAxiosRequestConfig<D = any> extends CustomAxiosRequestConfig<D> {
  headers: AxiosRequestHeaders
}

// 后端状态字段转化为前端状态字段
export const requestFieldConvert = data => {
  data[setting.result_code_key] = data.code
  data[setting.result_msg_key] = data.msg
}
